package com.example.androidlearning2422.ui.comp

import androidx.compose.foundation.Image
import androidx.compose.foundation.background
import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.width
import androidx.compose.foundation.pager.HorizontalPager
import androidx.compose.foundation.pager.rememberPagerState
import androidx.compose.foundation.shape.CircleShape
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableIntStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.layout.ContentScale
import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import coil.compose.rememberAsyncImagePainter
import com.example.androidlearning2422.ui.model.BannerItem
import kotlinx.coroutines.delay
import kotlinx.coroutines.isActive
import kotlinx.coroutines.launch

/**
 * Jetpack Compose 轮播图组件
 * @param bannerList 轮播图数据列表（图片URL）
 * @param autoPlay 是否自动播放（默认 true）
 * @param autoPlayDelay 自动播放间隔（默认 3000ms）
 * @param bannerHeight 轮播图高度（默认 200.dp）
 * @param indicatorSelectedColor 指示器选中颜色（默认主题主色）
 * @param indicatorUnselectedColor 指示器未选中颜色（默认灰色半透明）
 * @param onBannerClick 轮播图点击事件（参数为当前点击的图片URL）
 */
@Composable
fun BannerSlider(
    bannerList: List<BannerItem>,
    autoPlay: Boolean = true,
    autoPlayDelay: Long = 3000,
    bannerHeight: Int = 200,
    indicatorSelectedColor: Color = Color.Cyan,
    indicatorUnselectedColor: Color = Color.White.copy(alpha = 0.5f),
    onBannerClick: (String) -> Unit = {}
) {
    if (bannerList.isEmpty()) return

    val realPageCount = bannerList.size // 真实图片数量（如3）
    val coroutineScope = rememberCoroutineScope()

    // Pager状态：初始页0，页面计数用一个极大值（模拟无限循环）
    val pagerState = rememberPagerState(initialPage = 0, pageCount = { Int.MAX_VALUE })

    // 计算真实当前页（通过取模映射到原列表索引）
    val realCurrentPage by remember(pagerState.currentPage) {
        mutableIntStateOf((pagerState.currentPage % realPageCount + realPageCount) % realPageCount)
    }

    // 自动播放逻辑（核心：索引递增，通过取模实现循环）
    LaunchedEffect(autoPlay, autoPlayDelay, realPageCount) {
        if (!autoPlay) return@LaunchedEffect

        while (isActive) {
            delay(autoPlayDelay)
            // 每次只递增1，无需处理边界（因为pageCount是Int.MAX_VALUE）
            coroutineScope.launch {
                pagerState.animateScrollToPage(pagerState.currentPage + 1)
            }
        }
    }

    // 手动滑动到边缘时，平滑切换到对应真实页（优化体验）
    LaunchedEffect(pagerState.currentPage) {
        // 当当前页距离初始页过远时，重置到中间位置（避免Int.MAX_VALUE溢出，理论上很难触发）
        if (pagerState.currentPage > Int.MAX_VALUE / 2 || pagerState.currentPage < -Int.MAX_VALUE / 2) {
            pagerState.scrollToPage(realCurrentPage) // 重置到真实索引对应的中间页
        }
    }

    Box(
        modifier = Modifier
            .fillMaxWidth()
            .height(bannerHeight.dp)
    ) {
        // 水平分页组件（核心）
        HorizontalPager(
            state = pagerState, modifier = Modifier.fillMaxWidth(),
            // 禁止手动滑动时的过度滚动效果
            userScrollEnabled = true
        ) { page ->
            // 计算当前页对应的真实图片URL（通过取模）
            val realIndex = page % realPageCount
            val imageUrl = bannerList[realIndex].imagePath
            // 轮播图Item：图片加载（使用Coil库，需添加依赖）
            Box {
                Image(
                    painter = rememberAsyncImagePainter(model = imageUrl),
                    contentDescription = "轮播图",
                    modifier = Modifier
                        .fillMaxWidth()
                        .height(bannerHeight.dp)
                        .clickable { onBannerClick(bannerList[realCurrentPage].imagePath) },
                    contentScale = ContentScale.Crop // 图片缩放模式（根据需求调整）
                )

                Text(
                    bannerList[realIndex].title,
                    fontSize = 14.sp,
                    color = Color.White,
                    maxLines = 1,
                    overflow = TextOverflow.Ellipsis,
                    modifier = Modifier
                        .fillMaxWidth()
                        .background(Color(0x66000000))
                        .align(Alignment.BottomCenter)
                        .padding(horizontal = 12.dp, vertical = 6.dp),
                )
            }
        }

        // 底部指示器（圆点）
        Row(
            modifier = Modifier
                .align(Alignment.BottomCenter)
                .padding(bottom = 48.dp)
        ) {
            bannerList.forEachIndexed { index, _ ->
                Box(
                    modifier = Modifier
                        .padding(horizontal = 4.dp)
                        .clip(CircleShape)
                        .background(
                            color = if (index == realCurrentPage) {
                                indicatorSelectedColor
                            } else {
                                indicatorUnselectedColor
                            }
                        )
                        .height(8.dp)
                        .width(if (index == realCurrentPage) 24.dp else 8.dp) // 选中时圆点变宽
                )
            }
        }
    }
}